#ifndef PID_H_
#define PID_H_
#include "../../SAMA_Function.h"

typedef enum {
	Incremental_PID,				//< 增量式
	Positional_PID,					//< 位置式
}A_OutMode;


typedef enum {
	Positive,						//< 正作用
	Negative,						//< 反作用
}Direct;


typedef struct {
	float PVGain;		//< PV增益
	float PVBias;		//< PV偏置
	float SPGain;		//< SP增益
	float SPBias;		//< SP偏置
	float HighRange;	//< 输出量程上限
	float LowRange;		//< 输出量程下限
	float ErrALM;		//< 偏差报警限
	float A_OutRate;	//< 模拟量输出变化率
	A_OutMode AO_Mod;	//< 模拟量输出状态  增量式、位置式
	Direct PID_Dir;		//< 动作方向 正作用、反作用
}PID_Par_t;



typedef struct {
	float Last_AO;		//< 上一时刻模拟量输出
	bool Last_DO;		//< 上一时刻数字量输出							//< duan0627 现在的程序中用不到
	float Last_Err;		//< 上一时刻偏差值
	float Last_Ud;		//< 上一时刻微分作用
	float Last_Ui;		//< 上一时刻积分作用
	float ErrSum;		//< 偏差累积									//< duan0423 暂时没写
	float Last_Upid;	//< 上一时刻
	float Last_KP;		//< 上一时刻比例带								//< MingHua
}PID_Sta_t;



struct PID_T
{
	Model_Base_t Base;	//< 模块基本参数结构体
	PID_Par_t Par;		//< 模块可调参数结构体
	PID_Sta_t Sta;		//< 模块运算中间参数结构体
};


extern PID_T* PID_t;


bool CALCU_SAMA(PID)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO);		//< SAMA运算函数
int BC_PARA(PID)(Model_Base_t* arg, void** Data);													//< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
int BAK_STA(PID)(Model_Base_t* arg, void** Data);													//< 备份SAMA运算中间参数
int ANA_STA(PID)(Model_Base_t* arg, void** Data);													//< 解析备份的SAMA运算中间参数
int CHANGE_PAR(PID)(Model_Base_t* arg, void** Data);												//< 在线修改模块参数函数
void INIT_STAPAR(PID)(Model_Base_t* arg);															//< 初始化模块运算中间参数


#endif
